#include "GLCuboid.h"
#include <gl\glut.h>

GLCuboid::GLCuboid()
{

}

GLCuboid::GLCuboid(float xHalfExtent, float yHalfExtent, float zHalfExtent) : m_min(0,0,0), m_max(0,0,0)
{

	m_min.X -= xHalfExtent;
	m_min.Y -= yHalfExtent;
	m_min.Z -= zHalfExtent;
	m_max.X += xHalfExtent;
	m_max.Y += yHalfExtent;
	m_max.Z += zHalfExtent;
}

GLCuboid::GLCuboid(const Vec3f& halfSizeExtents)
{
	m_min.X -= halfSizeExtents.X;
	m_min.Y -= halfSizeExtents.Y;
	m_min.Z -= halfSizeExtents.Z;
	m_max.X += halfSizeExtents.X;
	m_max.Y += halfSizeExtents.Y;
	m_max.Z += halfSizeExtents.Z;
}

void GLCuboid::Draw()
{
	glPushMatrix();
			
		glBegin(GL_QUADS);

			//Front facing face
			glTexCoord2f(0,1);
			glVertex3f(m_min.X, m_min.Y, m_max.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_max.X, m_min.Y, m_max.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_max.X, m_max.Y, m_max.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_min.X, m_max.Y, m_max.Z);

			//Left facing face
			glTexCoord2f(0,1);
			glVertex3f(m_min.X, m_min.Y, m_min.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_min.X, m_min.Y, m_max.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_min.X, m_max.Y, m_max.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_min.X, m_max.Y, m_min.Z);

			//Rear facing face
			glTexCoord2f(0,1);
			glVertex3f(m_max.X, m_min.Y, m_min.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_min.X, m_min.Y, m_min.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_min.X, m_max.Y, m_min.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_max.X, m_max.Y, m_min.Z);

			//Right facing face
			glTexCoord2f(0,1);
			glVertex3f(m_max.X, m_min.Y, m_max.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_max.X, m_min.Y, m_min.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_max.X, m_max.Y, m_min.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_max.X, m_max.Y, m_max.Z);

			//Bottom facing face
			glTexCoord2f(0,1);
			glVertex3f(m_min.X, m_min.Y, m_min.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_max.X, m_min.Y, m_min.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_max.X, m_min.Y, m_max.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_min.X, m_min.Y, m_max.Z);

			//Top facing face!! Finally!
			glTexCoord2f(0,1);
			glVertex3f(m_min.X, m_max.Y, m_max.Z);
			glTexCoord2f(0,0);
			glVertex3f(m_max.X, m_max.Y, m_max.Z);
			glTexCoord2f(1,0);
			glVertex3f(m_max.X, m_max.Y, m_min.Z);
			glTexCoord2f(1,1);
			glVertex3f(m_min.X, m_max.Y, m_min.Z);

		glEnd();

	glPopMatrix();
}

Vec3f GLCuboid::GetMax()
{
	return m_max;
}

Vec3f GLCuboid::GetMin()
{
	return m_min;
}

void GLCuboid::SetMax(const Vec3f& max)
{
	m_max = max;
}

void GLCuboid::SetMin(const Vec3f& min)
{
	m_min = min;
}